home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / mcpr / mcpmain.asm < prev    next >
Assembly Source File  |  1991-10-18  |  7KB  |  414 lines

  1.     page    95,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§            マルチカラム コンパクト プリント ユーティリティ            §
  5. ;§                                                                          §
  6. ;§   Multicolumn Compact PRint utility   MCPR.EXE  Ver1.40    §
  7. ;§   ~           ~       ~~                                                 §
  8. ;§              Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     public    argv
  11.     public    argc
  12.     public    int24h
  13.     public    intflg
  14.     public    reprintflg
  15.     extrn    getarg:near
  16.     extrn    allocnambuf:near
  17.     extrn    options:near
  18.     extrn    allocprtbuf:near
  19.     extrn    prtinit:near
  20.     extrn    formprint:near
  21.     extrn    freeprtbuf:near
  22.     extrn    freenambuf:near
  23.     extrn    newfile:near
  24.     extrn    dosprint:near
  25.     extrn    dosstdout:near
  26.     extrn    abort:near
  27. ;
  28. CR    equ    0dh
  29. LF    equ    0ah
  30. ;
  31. data    segment para    public    'DATA'
  32. ;
  33. extrn    nameptr:dword
  34. extrn    nameptroff:word
  35. extrn    nameptrseg:word
  36. extrn    fhandle:word
  37. extrn    errorno:word
  38. ;
  39. argv    dd    32 dup(?)
  40. argc    dw    ?
  41. ;
  42. filecount   dw    0
  43. ;
  44. psp    label    dword
  45. pspoff    dw    0
  46. pspseg    dw    0
  47. ;
  48. devinfo    dw    ?
  49. breakflag    db    ?
  50. ;
  51. brkterm db    0ch
  52. prtterm db    1ch,'$',22h,77h,1bh,'[; G',1ch,'(`',71h
  53. prtrmsiz    equ    $-prtterm
  54. brtrmsiz    equ    $-brkterm
  55. ;
  56. prtend    db    9
  57. prtfilename db    40 dup(' ')
  58.     db    '  print end',CR,LF
  59. endmsgsz    equ     $-prtend
  60. ;
  61. helpmsg    label    byte
  62. db '          マルチカラム コンパクト プリント              1990/02/07 Ver1.40',CR,LF
  63. db '                     Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.',CR,LF
  64. db '使い方:MCPR <オプション> ファイル名・・・',CR,LF
  65. db ' -xx      xxカラムのマルチカラム印刷を行う           -Wxx    1ページの桁数',CR,LF
  66. db ' -Nxx     xx桁の行番号を付ける              -Kxx    1カラムの桁数',CR,LF
  67. db ' -H<タイトル> タイトルを付ける 無指定時はファイル情報   -Gxx    カラム間の空白桁数',CR,LF
  68. db ' -P<A|B|C> ASM,BASIC,C のルールでカラム替えする   -Txx    タブサイズ',CR,LF
  69. db ' -C       改ページコードを改行コードとして扱う   -Lxx    1ページの印刷行数',CR,LF
  70. db ' +xx-yy   xxページからyyページまで印刷        -Rxx    ページ替えを改行コードで行う',CR,LF
  71. db ' +xx,zz   xxページからzzページ分を印刷                    xxは1ページの物理行数',CR,LF
  72. db ' -Fx,y,<W|SL|SP|AP|AL|BP|BL>                -Mxx,yy xxは左マージン yyは上マージン',CR,LF
  73. db '   xは桁ピッチ       yは行ピッチ      以後は用紙指定',CR,LF
  74. db '    1=136桁・10cpi   1=60行・6lpi    ドットプリンタ  W=136桁連帳  SL=80桁連帳  SP=A4縦',CR,LF
  75. db '    2=204桁・15cpi   2=75行・7.5lpi  ページプリンタ  AP=A4縦  AL=A4横',CR,LF
  76. db '    3=272桁・20cpi   3=90行・9lpi                BP=B4縦  BL=B4横',CR,LF
  77. db '桁ピッチ=1or2の時 行ピッチ=3は指定できない    用紙によって印刷行桁の初期値は変わる',CR,LF
  78. db ' -?       標準書式の設定値を表示する        -Ux     ホッパーユニット指定',CR,LF
  79. db '                                                                               ',CR,LF
  80. hlpmsgsiz    equ    $-helpmsg
  81. ;
  82. paperemp    db '用紙がありません.<書込み中> デバイス $'
  83. writing        db '書込みができません. デバイス $'
  84. selectopt    db '中止<A>, もう一度<R>, 無視<I>, ページ打ち直し<P>? $'
  85. newline        db CR,LF,'$'
  86. data    ends
  87. ;
  88. code    segment para    public    'CODE'
  89.     assume    cs:code,ds:data,ss:stack
  90. int24h    dd    0
  91. intflg    db    2 dup(0)
  92. reprintflg    dw    0
  93. dataseg    dw    data
  94.     db    6 dup(0)
  95. ;
  96. entry    proc    far
  97. ;
  98.     mov    ax,seg    data
  99.     mov    es,ax
  100.     mov    es:pspseg,ds
  101.     mov    ax,ds:[12h]
  102.     mov    word ptr cs:int24h,ax
  103.     mov    ax,ds:[14h]
  104.     mov    word ptr cs:int24h+2,ax
  105. ;
  106.     mov    di,offset argv
  107.     call    getarg
  108.     push    es
  109.     pop    ds
  110.     mov    argc,ax
  111.     jz    noargs
  112. ;
  113.     call    allocnambuf
  114.     call    options
  115.     jz    noprint
  116.     mov    filecount,ax
  117. ;
  118.     call    allocprtbuf
  119.     call    sysalternate
  120. prtloop:
  121.     sub    filecount,1
  122.     jb    endprint
  123. ;
  124.     mov    ax,3d40h
  125.     push    ds
  126.     lds    si,nameptr
  127.     lds    dx,[si]
  128.     int    21h
  129.     pop    ds
  130.     jc    nextfile
  131. ;
  132.     call    newfile
  133.     call    formprint
  134. ;
  135.     mov    ah,3eh
  136.     mov    bx,fhandle
  137.     int    21h
  138.     call    prtendmsg
  139. nextfile:
  140.     add    nameptroff,4
  141.     jmp    short    prtloop
  142. endprint:
  143.     call    sysrestore
  144.     call    freeprtbuf
  145. noprint:
  146.     call    freenambuf
  147.     mov    ax,4c00h
  148.     int    21h
  149. ;
  150. noargs:
  151.     mov    errorno,0
  152.     mov    cx,hlpmsgsiz
  153.     mov    dx,offset helpmsg
  154.     jmp    abort
  155. ;
  156. entry    endp
  157. ;
  158. sysalternate    proc
  159. ;
  160.     mov    ax,3300h
  161.     int    21h
  162.     mov    breakflag,dl
  163. ;
  164.     mov    ax,3301h
  165.     mov    dl,1
  166.     int    21h
  167. ;
  168.     mov    ax,4400h
  169.     mov    bx,4
  170.     int    21h
  171.     mov    dh,0
  172.     mov    devinfo,dx
  173. ;
  174.     mov    ax,4401h
  175.     mov    bx,4
  176.     or    dl,20h
  177.     int    21h
  178. ;
  179.     push    ds
  180.     mov    ax,2523h
  181.     mov    dx,offset int23proc
  182.     push    cs
  183.     pop    ds
  184.     int    21h
  185. ;
  186.     mov    ax,2524h
  187.     mov    dx,offset int24proc
  188.     int    21h
  189.     pop    ds
  190. ;
  191.     call    prtinit
  192. ;
  193.     ret
  194. ;
  195. sysalternate    endp
  196. ;
  197. sysrestore  proc
  198. ;
  199.     mov    ax,3301h
  200.     mov    dl,breakflag
  201.     int    21h
  202. ;
  203.     mov    dx,offset prtterm
  204.     mov    cx,prtrmsiz
  205.     call    dosprint
  206. ;
  207.     mov    ax,4401h
  208.     mov    bx,4
  209.     mov    dx,devinfo
  210.     int    21h
  211. ;
  212.     ret
  213. ;
  214. sysrestore  endp
  215. ;
  216. prtendmsg   proc
  217. ;
  218.     cld
  219.     xor    ax,ax
  220.     mov    cx,-1
  221.     les    di,nameptr
  222.     les    di,es:[di]
  223.     mov    si,di
  224.   repne scasb
  225.     not    cx
  226.     dec    cx
  227.     mov    bx,40
  228.     sub    bx,cx
  229.     jae    nonameover
  230.     mov    bx,0
  231.     mov    cx,40
  232. nonameover:
  233.     push    es
  234.     mov    di,ds
  235.     mov    es,di
  236.     pop    ds
  237.     mov    di,offset prtfilename
  238.     rep movsb
  239.     mov    al,' '
  240.     mov    cx,bx
  241.     rep stosb
  242.     mov    di,es
  243.     mov    ds,di
  244.     mov    cx,endmsgsz
  245.     mov    dx,offset prtend
  246.     call    dosstdout
  247.     ret
  248. ;
  249. prtendmsg   endp
  250. ;
  251. int23proc   proc
  252. ;
  253.     test    cs:intflg,1
  254.     jz    ctrlc
  255.     iret
  256. ctrlc:
  257.     or    cs:intflg,1
  258.     test    cs:intflg,40h
  259.     jnz    fatalexit
  260. ;
  261.     mov    ds,cs:dataseg
  262. ;
  263.     mov    si,offset brkterm
  264.     mov    cx,brtrmsiz
  265. termoutloop:
  266.     mov    ah,5
  267.     mov    dl,[si]
  268.     int    21h
  269.     inc    si
  270.     loop    termoutloop
  271. ;
  272.     mov    ax,4401h
  273.     mov    bx,4
  274.     mov    dx,devinfo
  275.     int    21h
  276. fatalexit:
  277.     mov    ax,4c01h
  278.     int    21h
  279. ;
  280. int23proc   endp
  281. ;
  282. int24proc   proc
  283. ;
  284.     test    cs:intflg,80h
  285.     jnz    int24old
  286.     test    ah,8
  287.     jz    int24old
  288.     cmp    di,9
  289.     jb    int24old
  290.     cmp    di,0ah
  291.     ja    int24old
  292.     push    bp
  293.     mov    bp,sp
  294.     cmp    byte ptr [bp+9],40h
  295.     jne    intdefault
  296.     cmp    word ptr [bp+0ah],4
  297.     jne    intdefault
  298.     push    ds
  299.     mov    ds,[bp]
  300.     test    byte ptr [si+5],80h
  301.     pop    ds
  302.     jnz    intfatal
  303. intdefault:
  304.     pop    bp
  305. int24old:
  306.     or    cs:intflg,80h
  307.     jmp    cs:int24h
  308. ;
  309. intfatal:
  310.     pop    bp
  311.     or    cs:intflg,0c0h
  312.     push    ax
  313.     push    bx
  314.     push    cx
  315.     push    dx
  316.     push    si
  317.     push    di
  318.     push    bp
  319.     push    ds
  320.     push    es
  321.     mov    bp,sp
  322. ;
  323.     mov    ds,cs:dataseg
  324.     cmp    di,9
  325.     jne    writeerr
  326.     mov    dx,offset paperemp
  327.     jmp    short guide1out
  328. writeerr:
  329.     mov    dx,offset writing
  330. guide1out:
  331.     mov    ah,9
  332.     int    21h
  333. ;
  334.     mov    es,[bp+4]
  335.     lea    si,[si+10]
  336.     mov    cx,8
  337. devnameloop:
  338.     mov    ah,2
  339.     mov    dl,es:[si]
  340.     test    dl,dl
  341.     jz    newlines
  342.     cmp    dl,20h
  343.     je    newlines
  344.     int    21h
  345.     inc    si
  346.     loop    devnameloop
  347. newlines:
  348.     mov    ah,9
  349.     mov    dx,offset newline
  350.     int    21h
  351. questions:
  352.     mov    ah,9
  353.     mov    dx,offset selectopt
  354.     int    21h
  355. ;
  356.     mov    ax,0c01h
  357.     int    21h
  358. ;
  359.     push    ax
  360.     mov    ah,9
  361.     mov    dx,offset newline
  362.     int    21h
  363.     pop    ax
  364. ;
  365.     xor    ah,ah
  366.     cmp    al,'I'
  367.     je    oprdefault
  368.     cmp    al,'i'
  369.     je    oprdefault
  370.     inc    ah
  371.     cmp    al,'R'
  372.     je    oprretry
  373.     cmp    al,'r'
  374.     je    oprretry
  375.     inc    ah
  376.     cmp    al,'A'
  377.     je    oprdefault
  378.     cmp    al,'a'
  379.     je    oprdefault
  380.     inc    ah
  381.     cmp    al,'P'
  382.     je    oprpagehead
  383.     cmp    al,'p'
  384.     je    oprpagehead
  385. ;
  386.     jmp    questions
  387. ;
  388. oprpagehead:
  389.     mov    cs:reprintflg,-1
  390. oprretry:
  391.     and    cs:intflg,03fh
  392. oprdefault:
  393.     mov    [bp+10h],ah
  394. ;
  395.     pop    es
  396.     pop    ds
  397.     pop    bp
  398.     pop    di
  399.     pop    si
  400.     pop    dx
  401.     pop    cx
  402.     pop    bx
  403.     pop    ax
  404.     iret
  405. ;
  406. int24proc   endp
  407. ;
  408. code    ends
  409. ;
  410. stack    segment    para    stack    'STACK'
  411.     db    400h dup(?)
  412. stack    ends
  413.     end    entry
  414.